/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller;

import Model.*;
import View.LugaresEmPe;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 *
 * @author lcc
 */
public class Controller {

    private static Controller instance;
    private Sistema sistema;
    private Usuario usuario;

    private Controller() {
        sistema = Sistema.getInstance();
        usuario = new Usuario();
    }

    public synchronized static Controller getInstance() {
        if (instance == null) {
            instance = new Controller();
        }
        return instance;
    }

    public boolean cadastraUsuario(String nome, String login, String senha1, String senha2, int cargo) {
        if (nome == "" || login == "" || senha1 == "" || senha2 == "") {
            return false;
        } else if (!senha1.equals(senha2)) {
            return false;
        } else if (temLoginDuplicado(login)) {
            return false;
        } else {
            Usuario u = new Usuario();
            u.setNome(nome);
            u.setLogin(login);
            u.setSenha(senha1);
            if (cargo == 0) {
                u.setCargo(Cargo.FUNCIONARIODABILHETERIA);
            } else if (cargo == 1) {
                u.setCargo(Cargo.GERENTE);
            }
            Gerente g = new Gerente();
            g = g.usuarioToGerente(usuario);
            g.cadastraUsuario(u);
            return true;
        }
    }

    public Cargo validaUsuario(String usuario, String senha) {
        for (int i = 0; i < sistema.getUsuarios().size(); i++) {
            Usuario u = sistema.getUsuarios().get(i);
            if (u.getLogin().equals(usuario)) {
                if (u.getSenha().equals(senha)) {
                    this.usuario = u;
                    if (u.getCargo() == Cargo.GERENTE) {
                        return Cargo.GERENTE;
                    } else if (u.getCargo() == Cargo.FUNCIONARIODABILHETERIA) {
                        return Cargo.FUNCIONARIODABILHETERIA;
                    }
                }
            }
        }
        return null;
    }

    private boolean temLoginDuplicado(String login) {
        for (Usuario u : sistema.getUsuarios()) {
            if (u.getLogin().equals(login)) {
                return true;
            }
        }
        return false;
    }

    public String getUserName() {
        return usuario.getNome();
    }

    public Cargo getCargo() {
        return usuario.getCargo();
    }

    public List<Usuario> buscarUsuarios(String pesquisa) {
        List<Usuario> usuarios = new ArrayList<Usuario>();
        boolean adicionado = false;
        List<Usuario> usuariosSistema = sistema.getUsuarios();

        for (Usuario u : usuariosSistema) {
            if (u.getNome().equals(pesquisa)) {
                usuarios.add(u);
            } else if (u.getLogin().equals(pesquisa)) {
                usuarios.add(u);
            } else if ("gerente".equals(pesquisa.toLowerCase())) {
                if (u.getCargo() == Cargo.GERENTE) {
                    usuarios.add(u);
                }
            } else if ("funcionario da bilheteria".equals(pesquisa.toLowerCase())) {
                if (u.getCargo() == Cargo.FUNCIONARIODABILHETERIA) {
                    usuarios.add(u);
                }
            }
        }
        return usuarios;
    }

    public List<Evento> buscarEvento(String pesquisa) {
        List<Evento> eventos = new ArrayList<Evento>();
        boolean adicionado = false;
        List<Evento> eventosSistema = sistema.getEventos();

        for (Evento e : eventosSistema) {
            if (e.getNome().equalsIgnoreCase(pesquisa)) {
                eventos.add(e);
            } else {
                if (e.getTipoEvento().equalsIgnoreCase(pesquisa)) {
                    eventos.add(e);
                } else {
                    List<Artista> artistas = e.getArtistas();
                    for (Artista a : artistas) {
                        if (a.getNome().equalsIgnoreCase(pesquisa)) {
                            eventos.add(e);
                            adicionado = true;
                        } else {
                            if (a.getGenero().equalsIgnoreCase(pesquisa)) {
                                eventos.add(e);
                                adicionado = true;
                            }
                        }
                    }
                    if (!adicionado) {
                        if (e.getProdutor().getNome().equalsIgnoreCase(pesquisa)) {
                            eventos.add(e);
                        } else {
                            if (e.getProdutor().getProdutora().equalsIgnoreCase(pesquisa)) {
                                eventos.add(e);
                            }
                        }
                    }
                }

            }
        }
        return eventos;
    }

    public boolean vendeIngressoCadeira(String fileira, String numero, Evento evento) {
        return usuario.getFuncoesIngresso().vendeIngressoCadeira(evento, numero, fileira);
    }

    public boolean vendeIngressoEmPe(char setor, Evento evento) {
        return usuario.getFuncoesIngresso().vendeIngressoEmPe(evento, setor);
    }

    public boolean horarioDisponivel(Calendar inicio, Calendar fim) {
        if (fim.before(inicio)) {
            return false;
        }
        for (Evento e : sistema.getEventos()) {
            if (inicio.before(e.getFim()) && fim.after(e.getInicio())) {
                return false;
            } else {
                if (e.getInicio().before(fim) && e.getFim().after(inicio)) {
                    return false;
                }
            }
        }
        return true;
    }

    public boolean registraEvento(String nome, List<Artista> artistas, float precoIngresso,
            int qtdTotalIngressos, Calendar dataInicio, Calendar dataFim,
            String tipoEvento, String nomeProdutor,
            String nomeProdutora, float valorDoAluguel, float porcentagemVendaIngressos,
            String tipoAcomocadao) {

        int id = sistema.getId();
        Evento e = new Evento(id, nome, artistas, precoIngresso, qtdTotalIngressos, dataInicio, dataFim, tipoEvento,
                nomeProdutor, nomeProdutora, valorDoAluguel, porcentagemVendaIngressos, tipoAcomocadao);

        Gerente g = new Gerente();
        g = g.usuarioToGerente(usuario);
        boolean flag = g.registraEvento(e);
        return flag;
    }

    public boolean verificaDisponibilidadeCadeira(Evento evento, String numero, String nome) {
        return usuario.getFuncoesIngresso().verificaDisponibilidadeCadeira(evento, numero, nome);
    }

    public void removerUsuario(Usuario u) {
        Gerente g = new Gerente();
        g = g.usuarioToGerente(usuario);
        g.removerUsuario(u);
    }

    public void cancelarEvento(Evento evento) {
        Gerente gerente = new Gerente();
        gerente = gerente.usuarioToGerente(usuario);
        gerente.cancelarEvento(evento);
    }

    public boolean cancelaIngressoEmPe(char setor, Evento evento) {
        return usuario.getFuncoesIngresso().cancelaIngressoEmPe(evento, setor);
    }

    public boolean cancelaIngressoCadeira(String fileira, String numero, Evento evento) {
        return usuario.getFuncoesIngresso().cancelaIngressoCadeira(evento, fileira, numero);
    }
}
